package com.base.commons.tools.page;

import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * @author qiaodong
 * @since 2020-07-24
 */
@Data
@ApiModel(value = "分页请求")
public class PageReq implements Serializable {
    private static final long serialVersionUID = 1L;

    private static final int DEFAULT_PAGE = 1;
    private static final int DEFAULT_SIZE = 20;
    private static final int MAX_SIZE = 500;


    // 不使用 Validation, 做一定的容错(不在区间时使用默认值)

    @JsonProperty("page_index")
    @ApiModelProperty("当前页数, 不传或传入负数则默认是 " + DEFAULT_PAGE)
    protected int pageIndex = DEFAULT_PAGE;

    @JsonProperty("page_size")
    @ApiModelProperty("每页条数, 不传或传入负数则默认是 " + DEFAULT_SIZE + ", 传入大于 " + MAX_SIZE + " 的数则默认是 " + MAX_SIZE)
    protected int pageSize = DEFAULT_SIZE;

    @JsonProperty("page_token")
    @ApiModelProperty("es 返回的页面值, 接口有返回就拼上此值(上页使用 prev_token, 下页使用 next_token)")
    private String pageToken;


    /** 不用 <= 0 是因为目前很多地方用 setPageIndex 做了下面 getPageStart 的事 */
    public void setPageIndex(int pageIndex) {
        this.pageIndex = pageIndex < 0 ? DEFAULT_PAGE : pageIndex;
    }
    /** 传入 <= 0 的数就使用默认值, 传入 > max 的数就使用 max */
    public void setPageSize(int pageSize) {
        this.pageSize = (pageSize <= 0) ? DEFAULT_SIZE : Math.min(pageSize, MAX_SIZE);
    }

    /** 在 sql 中拼接 limit 时用到的值 */
    @ApiModelProperty(hidden = true)
    public int getPageStart() {
        // 兼容上面 setPageIndex(0) 的情况
        return (pageIndex <= 0) ? 0 : ((pageIndex - 1) * pageSize);
    }
}
